import 'dart:typed_data';
import 'package:bluetooth_protocols_plugin/src/base/realtime/realtime_info_base.dart';
import 'package:bluetooth_protocols_plugin/src/tools/utils.dart';

/*
  // 实时变量  74 字节
typedef ARM_PACKED struct{
    int16_t bus_voltage;                  //当前电池总电压      单位 0.01V
    int16_t bus_current;                  //当前电池输出总电流  单位 0.01A
    int16_t charge_voltage;               //充电口电压          单位 0.01V （来自驱动板）
    int16_t charge_current;               //充电总电流          单位 0.01A （来自驱动板）
    int16_t speed;                        //当前车速            单位 0.01km/h
    int16_t acce;                         //行驶加速度          单位 0.01km/h/s
    int16_t torque;                       //电机输出扭矩        单位 0.01N/m
    int16_t output_rate;                  //输出矢量电压百分比  单位 0.01%  范围 0~10000
    int16_t battery_output_power;         //电池输出功率        单位 1W
    int16_t motor_output_power;           //电机输出功率        单位 1W
    int16_t pitch_angle;                  //当前俯仰角度        单位 0.01°
    int16_t roll_angle;                   //当前翻滚角度        单位 0.01°
    int16_t aim_pitch_angle;              //当前目标俯仰角度    单位 0.01°
    int16_t speeding_braking_angle;       //加减速主动偏角      单位 0.01°
    uint16_t mileage;                     //本次里程            单位 0.01km
    uint16_t reserve1[2];                 //保留

    uint16_t battery_percentage;          //剩余电量            单位 0.01%
    uint16_t battery_percentage_for_ride; //剩余可行驶的电量百分比（剩余可行驶电量占总可行驶电量的比值） 单位 0.01%
    uint16_t estimated_total_mileage;     //预计满电可行驶里程  单位 0.01km
    uint16_t rt_over_speed_tilt_back_threshold;       //实时超速翘板阈值   单位 0.01km/h
    uint16_t rt_over_speed_warning_threshold;         //实时超速报警阈值   单位 0.01km/h
    uint16_t rt_over_output_tilt_back_threshold;      //实时输出饱和翘板阈值   单位 0.01%
    uint16_t rt_over_output_warning_threshold;        //实时输出饱和报警阈值   单位 0.01%
    uint16_t rt_over_bus_current_tilt_back_threshold; //实时母线过流翘板阈值   单位 0.01A
    uint16_t rt_over_bus_current_warning_threshold;   //实时母线过流报警阈值   单位 0.01A
    uint16_t rt_phase_current_limit;                  //实时相线限流值            单位 0.01A
    uint16_t reserve2[2];                 //保留

    int8_t mos_temperature;               //散热器(MOS管)温度   单位 °C  偏置80，即数值0代表80°C
    int8_t motor_temperature;             //电机温度            单位 °C  偏置80，即数值0代表80°C
    int8_t battery_temperature;           //电池温度            单位 °C  偏置80，即数值0代表80°C
    int8_t board_temperature;             //主板高温区温度      单位 °C  偏置80，即数值0代表80°C
    int8_t cpu_temperature;               //驱动板 CPU 温度     单位 °C  偏置80，即数值0代表80°C
    int8_t imu_temperature;               //IMU 温度            单位 °C  偏置80，即数值0代表80°C
    int8_t battery_max_cell_temperature;  //电池电芯最高温度    单位 °C  偏置80，即数值0代表80°C
    int8_t battery_max_bms_temperature;   //电池BMS最高温度     单位 °C  偏置80，即数值0代表80°C
    int8_t lamp_temperature;              //照明灯温度          单位 °C  偏置80，即数值0代表80°C
    uint8_t env_brightness;               //环境光亮度          单位 1%
    uint8_t lamp_brightness;              //照明灯实时亮度      单位 1%
    uint8_t lte_signal;                   //LTE信号强度  0 无信号  1 一格信号  2 二格信号  3 三格信号  4 四格信号
    uint8_t reserve3[4];                  //保留
  }GNUC_PACKED VX_REALTIME_INFO;
*/

abstract class LorinRealtimeInfo extends RealtimeInfoBase {
  // 当前电池总电压      单位 0.01V
  int busVoltage = 0;
  // 当前电池输出总电流  单位 0.01A
  int busCurrent = 0;
  // 充电口电压          单位 0.01V （来自驱动板）
  int chargeVoltage = 0;
  // 充电总电流          单位 0.01A （来自驱动板）
  int chargeCurrent = 0;
  // 当前车速            单位 0.01km/h
  int speed = 0;
  // 行驶加速度          单位 0.01km/h/s
  int acce = 0;
  // 电机输出扭矩        单位 0.01N/m
  int torque = 0;
  // 输出矢量电压百分比  单位 0.01%  范围 0~10000
  int outputRate = 0;
  // 电池输出功率        单位 1W
  int batteryOutputPower = 0;
  // 电机输出功率        单位 1W
  int motorOutputPower = 0;
  // 当前俯仰角度        单位 0.01°
  int pitchAngle = 0;
  // 当前翻滚角度        单位 0.01°
  int rollAngle = 0;
  // 当前目标俯仰角度    单位 0.01°
  int aimPitchAngle = 0;
  // 加减速主动偏角      单位 0.01°
  int speedingBrakingAngle = 0;
  // 本次里程            单位 0.01km
  int mileage = 0;
  // 保留
  List<int> reserve1 = List.filled(10, 0); // 假设保留10个int

  // 剩余电量            单位 0.01%
  int batteryPercentage = 0;
  // 剩余可行驶的电量百分比（剩余可行驶电量占总可行驶电量的比值） 单位 0.01%
  int batteryPercentageForRide = 0;
  // 预计满电可行驶里程  单位 0.01km
  int estimatedTotalMileage = 0;
  // 实时超速翘板阈值   单位 0.01km/h
  int rtOverSpeedTiltBackThreshold = 0;
  // 实时超速报警阈值   单位 0.01km/h
  int rtOverSpeedWarningThreshold = 0;
  // 实时输出饱和翘板阈值   单位 0.01%
  int rtOverOutputTiltBackThreshold = 0;
  // 实时输出饱和报警阈值   单位 0.01%
  int rtOverOutputWarningThreshold = 0;
  // 实时母线过流翘板阈值   单位 0.01A
  int rtOverBusCurrentTiltBackThreshold = 0;
  // 实时母线过流报警阈值   单位 0.01A
  int rtOverBusCurrentWarningThreshold = 0;
  // 实时相线限流值            单位 0.01A
  int rtPhaseCurrentLimit = 0;
  // 保留
  List<int> reserve2 = List.filled(10, 0); // 假设保留10个int

  // 散热器(MOS管)温度   单位 °C  偏置80，即数值0代表80°C
  int mosTemperature = 0;
  // 电机温度            单位 °C  偏置80，即数值0代表80°C
  int motorTemperature = 0;
  // 电池温度            单位 °C  偏置80，即数值0代表80°C
  int batteryTemperature = 0;
  // 主板高温区温度      单位 °C  偏置80，即数值0代表80°C
  int boardTemperature = 0;
  // 驱动板 CPU 温度     单位 °C  偏置80，即数值0代表80°C
  int cpuTemperature = 0;
  // IMU 温度            单位 °C  偏置80，即数值0代表80°C
  int imuTemperature = 0;
  // 电池电芯最高温度    单位 °C  偏置80，即数值0代表80°C
  int batteryMaxCellTemperature = 0;
  // 电池BMS最高温度     单位 °C  偏置80，即数值0代表80°C
  int batteryMaxBmsTemperature = 0;
  // 照明灯温度          单位 °C  偏置80，即数值0代表80°C
  int lampTemperature = 0;
  // 环境光亮度          单位 1%
  int envBrightness = 0;
  // 照明灯实时亮度      单位 1%
  int lampBrightness = 0;
  // LTE信号强度  0 无信号  1 一格信号  2 二格信号  3 三格信号  4 四格信号
  int lteSignal = 0;
  // 保留
  List<int> reserve3 = List.filled(10, 0); // 假设保留10个int

  // 从字节数据解析
  LorinRealtimeInfo.fromBytes(Uint8List bytes) : super.fromBytes(bytes) {
    if (bytes.length < minLength) {
      throw ArgumentError(
          '字节数组长度不足，无法解析 $runtimeType，期望长度至少为 $minLength，实际长度为 ${bytes.length}');
    }
    var byteData = ByteData.sublistView(bytes);

    busVoltage = byteData.getInt16(0, Endian.little);
    busCurrent = byteData.getInt16(2, Endian.little);
    chargeVoltage = byteData.getInt16(4, Endian.little);
    chargeCurrent = byteData.getInt16(6, Endian.little);
    speed = byteData.getInt16(8, Endian.little);
    acce = byteData.getInt16(10, Endian.little);
    torque = byteData.getInt16(12, Endian.little);
    outputRate = byteData.getInt16(14, Endian.little);
    batteryOutputPower = byteData.getInt16(16, Endian.little);
    motorOutputPower = byteData.getInt16(18, Endian.little);
    pitchAngle = byteData.getInt16(20, Endian.little);
    rollAngle = byteData.getInt16(22, Endian.little);
    aimPitchAngle = byteData.getInt16(24, Endian.little);
    speedingBrakingAngle = byteData.getInt16(26, Endian.little);
    mileage = byteData.getUint16(28, Endian.little);
    reserve1 = [
      byteData.getUint16(30, Endian.little),
      byteData.getUint16(32, Endian.little)
    ];

    batteryPercentage = byteData.getUint16(34, Endian.little);
    batteryPercentageForRide = byteData.getUint16(36, Endian.little);
    estimatedTotalMileage = byteData.getUint16(38, Endian.little);
    rtOverSpeedTiltBackThreshold = byteData.getUint16(40, Endian.little);
    rtOverSpeedWarningThreshold = byteData.getUint16(42, Endian.little);
    rtOverOutputTiltBackThreshold = byteData.getUint16(44, Endian.little);
    rtOverOutputWarningThreshold = byteData.getUint16(46, Endian.little);
    rtOverBusCurrentTiltBackThreshold = byteData.getUint16(48, Endian.little);
    rtOverBusCurrentWarningThreshold = byteData.getUint16(50, Endian.little);
    rtPhaseCurrentLimit = byteData.getUint16(52, Endian.little);
    reserve2 = [
      byteData.getUint16(54, Endian.little),
      byteData.getUint16(56, Endian.little)
    ];

    mosTemperature = byteData.getInt8(58) + 80;
    motorTemperature = byteData.getInt8(59) + 80;
    batteryTemperature = byteData.getInt8(60) + 80;
    boardTemperature = byteData.getInt8(61) + 80;
    cpuTemperature = byteData.getInt8(62) + 80;
    imuTemperature = byteData.getInt8(63) + 80;
    batteryMaxCellTemperature = byteData.getInt8(64) + 80;
    batteryMaxBmsTemperature = byteData.getInt8(65) + 80;
    lampTemperature = byteData.getInt8(66) + 80;
    envBrightness = byteData.getUint8(67);
    lampBrightness = byteData.getUint8(68);
    lteSignal = byteData.getUint8(69);
    reserve3 = [
      byteData.getUint8(70),
      byteData.getUint8(71),
      byteData.getUint8(72),
      byteData.getUint8(73)
    ];
  }

  // 将对象转换为字节数据
  @override
  Uint8List toBytes() {
    var byteData = ByteData(minLength);

    byteData.setInt16(0, busVoltage, Endian.little);
    byteData.setInt16(2, busCurrent, Endian.little);
    byteData.setInt16(4, chargeVoltage, Endian.little);
    byteData.setInt16(6, chargeCurrent, Endian.little);
    byteData.setInt16(8, speed, Endian.little);
    byteData.setInt16(10, acce, Endian.little);
    byteData.setInt16(12, torque, Endian.little);
    byteData.setInt16(14, outputRate, Endian.little);
    byteData.setInt16(16, batteryOutputPower, Endian.little);
    byteData.setInt16(18, motorOutputPower, Endian.little);
    byteData.setInt16(20, pitchAngle, Endian.little);
    byteData.setInt16(22, rollAngle, Endian.little);
    byteData.setInt16(24, aimPitchAngle, Endian.little);
    byteData.setInt16(26, speedingBrakingAngle, Endian.little);
    byteData.setUint16(28, mileage, Endian.little);
    byteData.setUint16(30, reserve1[0], Endian.little);
    byteData.setUint16(32, reserve1[1], Endian.little);

    byteData.setUint16(34, batteryPercentage, Endian.little);
    byteData.setUint16(36, batteryPercentageForRide, Endian.little);
    byteData.setUint16(38, estimatedTotalMileage, Endian.little);
    byteData.setUint16(40, rtOverSpeedTiltBackThreshold, Endian.little);
    byteData.setUint16(42, rtOverSpeedWarningThreshold, Endian.little);
    byteData.setUint16(44, rtOverOutputTiltBackThreshold, Endian.little);
    byteData.setUint16(46, rtOverOutputWarningThreshold, Endian.little);
    byteData.setUint16(48, rtOverBusCurrentTiltBackThreshold, Endian.little);
    byteData.setUint16(50, rtOverBusCurrentWarningThreshold, Endian.little);
    byteData.setUint16(52, rtPhaseCurrentLimit, Endian.little);
    byteData.setUint16(54, reserve2[0], Endian.little);
    byteData.setUint16(56, reserve2[1], Endian.little);

    byteData.setInt8(58, mosTemperature - 80);
    byteData.setInt8(59, motorTemperature - 80);
    byteData.setInt8(60, batteryTemperature - 80);
    byteData.setInt8(61, boardTemperature - 80);
    byteData.setInt8(62, cpuTemperature - 80);
    byteData.setInt8(63, imuTemperature - 80);
    byteData.setInt8(64, batteryMaxCellTemperature - 80);
    byteData.setInt8(65, batteryMaxBmsTemperature - 80);
    byteData.setInt8(66, lampTemperature - 80);
    byteData.setUint8(67, envBrightness);
    byteData.setUint8(68, lampBrightness);
    byteData.setUint8(69, lteSignal);
    byteData.setUint8(70, reserve3[0]);
    byteData.setUint8(71, reserve3[1]);
    byteData.setUint8(72, reserve3[2]);
    byteData.setUint8(73, reserve3[3]);

    return byteData.buffer.asUint8List();
  }

  // 将对象转换为Map
  @override
  Map<String, dynamic> toMap() {
    return {
      'bus_voltage': busVoltage,
      'bus_current': busCurrent,
      'charge_voltage': chargeVoltage,
      'charge_current': chargeCurrent,
      'speed': speed,
      'acce': acce,
      'torque': torque,
      'output_rate': outputRate,
      'battery_output_power': batteryOutputPower,
      'motor_output_power': motorOutputPower,
      'pitch_angle': pitchAngle,
      'roll_angle': rollAngle,
      'aim_pitch_angle': aimPitchAngle,
      'speeding_braking_angle': speedingBrakingAngle,
      'mileage': mileage,
      'reserve1': reserve1,
      'battery_percentage': batteryPercentage,
      'battery_percentage_for_ride': batteryPercentageForRide,
      'estimated_total_mileage': estimatedTotalMileage,
      'rt_over_speed_tilt_back_threshold': rtOverSpeedTiltBackThreshold,
      'rt_over_speed_warning_threshold': rtOverSpeedWarningThreshold,
      'rt_over_output_tilt_back_threshold': rtOverOutputTiltBackThreshold,
      'rt_over_output_warning_threshold': rtOverOutputWarningThreshold,
      'rt_over_bus_current_tilt_back_threshold':
          rtOverBusCurrentTiltBackThreshold,
      'rt_over_bus_current_warning_threshold': rtOverBusCurrentWarningThreshold,
      'rt_phase_current_limit': rtPhaseCurrentLimit,
      'reserve2': reserve2,
      'mos_temperature': mosTemperature,
      'motor_temperature': motorTemperature,
      'battery_temperature': batteryTemperature,
      'board_temperature': boardTemperature,
      'cpu_temperature': cpuTemperature,
      'imu_temperature': imuTemperature,
      'battery_max_cell_temperature': batteryMaxCellTemperature,
      'battery_max_bms_temperature': batteryMaxBmsTemperature,
      'lamp_temperature': lampTemperature,
      'env_brightness': envBrightness,
      'lamp_brightness': lampBrightness,
      'lte_signal': lteSignal,
      'reserve3': reserve3,
    };
  }

  @override
  int dataIntValue() {
    return Utils.computeDataIntVal(toBytes());
  }

  @override
  int dataLength() {
    return toBytes().length;
  }

  @override
  int get minLength => 74;
}
